#include "arbol_tests.h"
#include "../Utilidades/Constantes.h"


void test_arbol(){
	//Funciona
	string *tipo = new string ("string");
	ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);
	Clave clave = Clave ("Andrelo");
	unsigned int i = 79;
	arbolito_lindo_que_funciona->Agregar(clave, i);
	list<unsigned int> *ids = arbolito_lindo_que_funciona->buscarClave(clave);
	if (ids->size()!=1){
		cout << "Hay un error en el size de la lista";
	}else if (ids->front() != 79){
		cout << "Se guardo un id que no era";
	}
	else if (ids->front() == i){
		cout << "TODO PIOLA";
	}
	arbolito_lindo_que_funciona->mostrarArbol();
	delete arbolito_lindo_que_funciona;


}

void test_agregar_claves_diferentes(){
	//Funciona

	string *tipo = new string ("string");
	ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);

	Clave clave = Clave("Andrelo");
	unsigned int i = 79;

	Clave clave2 = Clave ("Calamardo");
	unsigned int i2 = 78;

	arbolito_lindo_que_funciona->Agregar(clave, i);
	arbolito_lindo_que_funciona->Agregar(clave2,i2);

	arbolito_lindo_que_funciona->mostrarArbol();
	delete arbolito_lindo_que_funciona;
}

void test_arbol_partir_raiz(){
	//Funciona
	string *tipo = new string ("string");
	ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);
	stringstream ss;

	for (unsigned int i = 0; i<4; i++){
		ss << i;
		arbolito_lindo_que_funciona->Agregar(Clave(ss.str()), i);
	}
	arbolito_lindo_que_funciona->Agregar(Clave("aaa") , 5);

	arbolito_lindo_que_funciona->mostrarArbol();
	delete arbolito_lindo_que_funciona;
}
void prueba_indice_invertido(){
	//Funciona
IndiceInvertido *indice = new IndiceInvertido(".");
indice->agregar("hgaiajoadsjhhgghhgj", 82);
cout<<"0\n";
indice->agregar("hola", 10);
cout<<"1\n";
indice->agregar("chau", 10);
cout<<"2\n";
indice->agregar("fgaiajoad", 220);
cout<<"3\n";
indice->agregar("aaa", 455);
cout<<"4\n";
indice->agregar("dddddddd", 45);
cout<<"5\n";
indice->agregar("rrrr", 3);
cout<<"6\n";
indice->agregar("fgaiajoad", 20);
cout<<"7\n";
indice->agregar("aaa",4);
cout<<"8\n";
indice->agregar("fgaiajoad", 120);
cout<<"9\n";
indice->agregar("dsafgds", 4);
cout<<"10\n";
indice->agregar("aaa",23);
cout<<"11\n";
indice->agregar("hgaiajoadsjhhgghhgj", 2);
cout<<"12\n";
cout << "Documentos: " << endl;
list<unsigned int> *docs = indice->BuscarFrase("hgaiajoadsjhhgghhgj");
if(docs != NULL) {
list<unsigned int>::iterator it;
for (it = docs->begin(); it != docs->end(); it++){
cout << *it << endl;
}
delete docs;
}
delete indice;
cout << "llega" << endl;
}
void test_arbol_partir_raiz_y_borrar(){
	//Funciona
	string *tipo = new string ("string");
	ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);

	arbolito_lindo_que_funciona->Agregar(Clave("E"), 5);
	arbolito_lindo_que_funciona->Agregar(Clave("B"), 2);
	arbolito_lindo_que_funciona->Agregar(Clave("C"), 3);
	arbolito_lindo_que_funciona->Agregar(Clave("D"), 4);
	arbolito_lindo_que_funciona->Agregar(Clave("A"), 1);
	cout<<"Sin borrar la B \n";
	arbolito_lindo_que_funciona->mostrarArbol();
	cout<<"\n";
	arbolito_lindo_que_funciona->Borrar(Clave("B"),2);
	cout<<"Con la B borrada \n";
	arbolito_lindo_que_funciona->mostrarArbol();
	cout<<"\n";
	arbolito_lindo_que_funciona->Borrar(Clave("D"),4);
	cout<<"Con la D borrada \n";
	arbolito_lindo_que_funciona->mostrarArbol();
	cout<<"\n";
	arbolito_lindo_que_funciona->Agregar(Clave("B"), 2);
	cout<<"Con la B agregada \n";
	arbolito_lindo_que_funciona->mostrarArbol();
	cout<<"\n";
	arbolito_lindo_que_funciona->Agregar(Clave("D"),4);
	cout<<"Con la D agregada \n";
	arbolito_lindo_que_funciona->mostrarArbol();
	cout<<"fin";
	delete arbolito_lindo_que_funciona;
	delete tipo;
}

void test_arbol_partir_raiz_e_interno(){
	//Funciona
	string *tipo = new string ("string");
	ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);
	delete tipo;

	arbolito_lindo_que_funciona->Agregar(Clave("A"), 1);
	arbolito_lindo_que_funciona->Agregar(Clave("B"), 2);
	arbolito_lindo_que_funciona->Agregar(Clave("C"), 3);
	arbolito_lindo_que_funciona->Agregar(Clave("D"), 4);
	arbolito_lindo_que_funciona->Agregar(Clave("E"), 5);
	arbolito_lindo_que_funciona->Agregar(Clave("F"),6);
	arbolito_lindo_que_funciona->Agregar(Clave("G"),7); //ACA tira otro overflow
	arbolito_lindo_que_funciona->Agregar(Clave("H"),8);
	arbolito_lindo_que_funciona->Agregar(Clave("I"),9);
	arbolito_lindo_que_funciona->Agregar(Clave("J"),10);
	arbolito_lindo_que_funciona->Agregar(Clave("K"),11);
	arbolito_lindo_que_funciona->Agregar(Clave("L"),12);
	arbolito_lindo_que_funciona->Agregar(Clave("M"),13);
	arbolito_lindo_que_funciona->Agregar(Clave("N"),14);
	arbolito_lindo_que_funciona->Agregar(Clave("P"),15);
	arbolito_lindo_que_funciona->Agregar(Clave("Q"),16);
	arbolito_lindo_que_funciona->Agregar(Clave("R"),17); //ACA tira overflow de un nodo interno.
	arbolito_lindo_que_funciona->Agregar(Clave("S"),18);
	arbolito_lindo_que_funciona->Agregar(Clave("T"),19);
	arbolito_lindo_que_funciona->Agregar(Clave("U"),20);
	arbolito_lindo_que_funciona->Agregar(Clave("V"),21);
	arbolito_lindo_que_funciona->Agregar(Clave("W"),22);
	arbolito_lindo_que_funciona->Agregar(Clave("X"),23);
	arbolito_lindo_que_funciona->Agregar(Clave("Y"),24);
	arbolito_lindo_que_funciona->Agregar(Clave("Z"),25);
	arbolito_lindo_que_funciona->mostrarArbol();
	cout<<"\n"<<"fin";
	delete arbolito_lindo_que_funciona;
}

void test_si_anda_este_ya_estamos(){
	//Con esta me voy a estar peleando cuando vuelva de cursar.
	//Pincha en mergenodointerno derecho.
	//Para motivar a resolver el problema:
	//Borrar A es el mas importante porque desencadena una serie de merges de nodos
	//Si funciona ese casi q funcionan los demas...faltara algun caso.
	string *tipo = new string ("string");
		ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);
		delete tipo;

		arbolito_lindo_que_funciona->Agregar(Clave("A"), 1);
		arbolito_lindo_que_funciona->Agregar(Clave("B"), 2);
		arbolito_lindo_que_funciona->Agregar(Clave("C"), 3);
		arbolito_lindo_que_funciona->Agregar(Clave("D"), 4);
		arbolito_lindo_que_funciona->Agregar(Clave("E"), 5);
		arbolito_lindo_que_funciona->Agregar(Clave("F"),6);
		arbolito_lindo_que_funciona->Agregar(Clave("G"),7); //ACA tira otro overflow
		arbolito_lindo_que_funciona->Agregar(Clave("H"),8);
		arbolito_lindo_que_funciona->Agregar(Clave("I"),9);
		arbolito_lindo_que_funciona->Agregar(Clave("J"),10);
		arbolito_lindo_que_funciona->Agregar(Clave("K"),11);
		arbolito_lindo_que_funciona->Agregar(Clave("L"),12);
		arbolito_lindo_que_funciona->Agregar(Clave("M"),13);
		arbolito_lindo_que_funciona->Agregar(Clave("N"),14);
		arbolito_lindo_que_funciona->Agregar(Clave("P"),15);
		arbolito_lindo_que_funciona->Agregar(Clave("Q"),16);
		arbolito_lindo_que_funciona->Agregar(Clave("R"),17); //ACA tira overflow de un nodo interno.
		arbolito_lindo_que_funciona->Agregar(Clave("S"),18);
		arbolito_lindo_que_funciona->Agregar(Clave("T"),19);
		arbolito_lindo_que_funciona->Agregar(Clave("U"),20);
		arbolito_lindo_que_funciona->Agregar(Clave("V"),21);
		arbolito_lindo_que_funciona->Agregar(Clave("W"),22);
		arbolito_lindo_que_funciona->Agregar(Clave("X"),23);
		arbolito_lindo_que_funciona->Agregar(Clave("Y"),24);
		arbolito_lindo_que_funciona->Agregar(Clave("Z"),25);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("A"), 1);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("B"), 2);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("C"), 3);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("D"), 4);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("E"), 5);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("F"),6);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("G"),7);
		arbolito_lindo_que_funciona->Borrar(Clave("H"),8);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("I"),9);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("J"),10);
		arbolito_lindo_que_funciona->Borrar(Clave("K"),11);
		arbolito_lindo_que_funciona->Borrar(Clave("L"),12);
		arbolito_lindo_que_funciona->Borrar(Clave("M"),13);
		arbolito_lindo_que_funciona->Borrar(Clave("N"),14);
		arbolito_lindo_que_funciona->Borrar(Clave("P"),15);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("Q"),16);
		arbolito_lindo_que_funciona->Borrar(Clave("R"),17);
		arbolito_lindo_que_funciona->Borrar(Clave("S"),18);
		arbolito_lindo_que_funciona->Borrar(Clave("T"),19);
		arbolito_lindo_que_funciona->Borrar(Clave("U"),20);
		arbolito_lindo_que_funciona->Borrar(Clave("V"),21);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("W"),22);
		arbolito_lindo_que_funciona->Borrar(Clave("X"),23);
		arbolito_lindo_que_funciona->Borrar(Clave("Y"),24);
		arbolito_lindo_que_funciona->Borrar(Clave("Z"),25);
		arbolito_lindo_que_funciona->mostrarArbol();

		arbolito_lindo_que_funciona->mostrarArbol();
		delete arbolito_lindo_que_funciona;

}

void test_prueba_borrar_invertido(){
	//Con esta me voy a estar peleando cuando vuelva de cursar.
	//Pincha en mergenodointerno derecho.
	//Para motivar a resolver el problema:
	//Borrar A es el mas importante porque desencadena una serie de merges de nodos
	//Si funciona ese casi q funcionan los demas...faltara algun caso.
	string *tipo = new string ("string");
		ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);
		delete tipo;

		arbolito_lindo_que_funciona->Agregar(Clave("A"), 1);
		arbolito_lindo_que_funciona->Agregar(Clave("B"), 2);
		arbolito_lindo_que_funciona->Agregar(Clave("C"), 3);
		arbolito_lindo_que_funciona->Agregar(Clave("D"), 4);
		arbolito_lindo_que_funciona->Agregar(Clave("E"), 5);
		arbolito_lindo_que_funciona->Agregar(Clave("F"),6);
		arbolito_lindo_que_funciona->Agregar(Clave("G"),7); //ACA tira otro overflow
		arbolito_lindo_que_funciona->Agregar(Clave("H"),8);
		arbolito_lindo_que_funciona->Agregar(Clave("I"),9);
		arbolito_lindo_que_funciona->Agregar(Clave("J"),10);
		arbolito_lindo_que_funciona->Agregar(Clave("K"),11);
		arbolito_lindo_que_funciona->Agregar(Clave("L"),12);
		arbolito_lindo_que_funciona->Agregar(Clave("M"),13);
		arbolito_lindo_que_funciona->Agregar(Clave("N"),14);
		arbolito_lindo_que_funciona->Agregar(Clave("P"),15);
		arbolito_lindo_que_funciona->Agregar(Clave("Q"),16);
		arbolito_lindo_que_funciona->Agregar(Clave("R"),17); //ACA tira overflow de un nodo interno.
		arbolito_lindo_que_funciona->Agregar(Clave("S"),18);
		arbolito_lindo_que_funciona->Agregar(Clave("T"),19);
		arbolito_lindo_que_funciona->Agregar(Clave("U"),20);
		arbolito_lindo_que_funciona->Agregar(Clave("V"),21);
		arbolito_lindo_que_funciona->Agregar(Clave("W"),22);
		arbolito_lindo_que_funciona->Agregar(Clave("X"),23);
		arbolito_lindo_que_funciona->Agregar(Clave("Y"),24);
		arbolito_lindo_que_funciona->Agregar(Clave("Z"),25);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("Z"), 25);
		arbolito_lindo_que_funciona->Borrar(Clave("Y"), 24);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("X"), 23);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("W"), 22);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("V"), 21);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("U"), 20);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("T"),19);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("S"),18);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("R"),17);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("Q"),16);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("P"),15);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("O"),11);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("N"),14);//ROMPE
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("M"),13);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("L"),12);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("K"),11);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("J"),10);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("I"),9);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("H"),8);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("G"),7);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("F"),6);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("E"),5);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("D"),4);//Aca se pudre todo
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("C"),3);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("B"),2);
		arbolito_lindo_que_funciona->mostrarArbol();
		arbolito_lindo_que_funciona->Borrar(Clave("A"),1);
		arbolito_lindo_que_funciona->mostrarArbol();
		delete arbolito_lindo_que_funciona;
}


void test_arbol_borrar_raiz_hoja(){
	//Funciona
	string *tipo = new string ("string");
		ArbolBMas * arbolito_lindo_que_funciona = new ArbolBMas("."PATH_ARBOL,*tipo);
		Clave clave = Clave("Andrelo");
		unsigned int i = 79;
		arbolito_lindo_que_funciona->Agregar(clave, i);
		arbolito_lindo_que_funciona->Borrar(clave,i);
		arbolito_lindo_que_funciona->mostrarArbol();
}
